// 多继承
// 如果有一个Worker表示工作者
// 由Worker派生出来 Singer和Waiter
// 由 Singer和Waiter 派生出 SingerWaiter类

//           Worker
//          /      \
//         /        \
//        /          \
//    Singer        Waiter
//       \            /
//        \          /
//         \        /
//          \      /
//        SingerWaiter

// 因为singer和waiter都继承了一个worker组件,因此singerwaiter将包含两个worker组件。
// 正如预期的，这将引起问题。通常可以将派生类对象的地址付给基类地址，但现在将出现二义性。
// 我们应当使用强制类型转换来指定对象。

// Signer *sig = (Singer *)&singer_waiter;

// 包含两个worker对象拷贝还会导致其他的问题，然而真正的问题是为什么需要worker对象的两个拷贝？
// 唱歌和侍者应该和其他的worker对象一样，也应只包含一个姓名和一个ID

// C++在引入多重继承的同时，引入了一种新技术--虚基类 ,使这种继承方式(当个worker)成为可能

// 1.虚基类
// 虚基类使得从多个类(他们的基类相同)派生出的对象只继承一个基类对象
// 通过在类声明中使用关键字virtual, 可以使worker被用作singer和waiter的虚基类。virtual和public的次序无关紧要

// class Singer : virtual public Worker { };
// class Waiter : public virtual Worker { };
// class SingerWaiter : public Singer, public Waiter { };
// 现在SingerWaiter对象将只包含Worker对象的一个副本,并且可以使用多态













